package com.twasyl.slideshowfx.snippet.executor.javascript; import com.twasyl.slideshowfx.snippet.executor.AbstractSnippetExecutor; import com.twasyl.slideshowfx.snippet.executor.CodeSnippet; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.Parent; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.io.StringWriter; import java.util.logging.Logger; /** * An implementation of * {@link com.twasyl.slideshowfx.snippet.executor.AbstractSnippetExecutor} that * allows to execute JavaScript code snippets. This implementation is identified * with the code {@code JAVASCRIPT}. * * @author Thierry Wasyczenko * @version 1.0 * @since SlideshowFX 1.0 */ public class JavaScriptSnippetExecutor extends AbstractSnippetExecutor<JavaScriptSnippetExecutorOptions> { private static final Logger LOGGER = Logger.getLogger(JavaScriptSnippetExecutor.class.getName()); public JavaScriptSnippetExecutor() { super("JAVASCRIPT", "JavaScript", "language-javascript"); this.setOptions(new JavaScriptSnippetExecutorOptions()); } @Override public Parent getUI(final CodeSnippet codeSnippet) { return null; } @Override public Node getConfigurationUI() { return null; } @Override public void saveNewOptions() { } @Override public ObservableList<String> execute(final CodeSnippet codeSnippet) { final ObservableList<String> consoleOutput = FXCollections.observableArrayList(); final Thread snippetThread = new Thread(() -> { final StringWriter writer = new StringWriter(); final ScriptEngineManager manager = new ScriptEngineManager(); final ScriptEngine engine = manager.getEngineByName("nashorn"); engine.getContext().setWriter(writer); try { engine.eval(codeSnippet.getCode()); consoleOutput.add(writer.toString()); } catch (ScriptException ex) { consoleOutput.add(ex.getMessage()); } }); snippetThread.start(); return consoleOutput; } }